package main

import (
	"5title_gin/cmd/cli"
	"5title_gin/config"
	_ "5title_gin/docs"
	"5title_gin/global"
	"5title_gin/internal/api/routers"
	"5title_gin/internal/task"
	"5title_gin/pkg/db"
	"5title_gin/pkg/redis"
	"5title_gin/pkg/storage"
	_zap "5title_gin/pkg/zap"
	"fmt"

	"github.com/common-nighthawk/go-figure"
	"go.uber.org/zap"
)

// @title 5titleAdmin项目api文档
// @version 1.0
// @description 5titleAdminAPI文档
// @host 127.0.0.1:8080
// @BasePath /
func main() {
	fmt.Println("🚀 服务器启动中... (ฅ'ω'ฅ) 💨")
	// 创建一个新的 figure 对象，选择字体和文本
	myFigure := figure.NewFigure("5title-gin", "slant", true) // 修改字体名
	// 打印 ASCII 艺术
	myFigure.Print()

	// 读取配置（如果cli.Parse中没有设置配置）
	if global.Config == nil {
		global.Config = config.ReadConfig()
	}

	if global.Config == nil {
		zap.S().Warn("读取配置失败，程序退出") // ❌ 重大错误，直接退出
		return
	}

	// 初始化日志
	log := _zap.InitLog() // ⚡️ 这个要先调用，否则 `zap.S()` 可能会报空指针
	defer func(log *zap.Logger) {
		if err := log.Sync(); err != nil {
			zap.S().Error("日志同步失败:", err)
		}

	}(log)

	// 解析命令行参数
	cli.Parse()

	// 初始化存储
	global.Storage, _ = storage.NewStorage(global.Config)

	// 初始化数据库配置
	global.DB = db.InitGorm()
	// 初始化redis配置
	global.Redis = redis.InitRedis()
	cli.Run()

	// 启动用户状态检查器
	task.StartUserStatusChecker()

	routers.Run()

}
